package com.itheima.workqueue;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @作者 itcast
 * @创建日期 2020/11/4 10:41
 **/
public class MqConsumer2 {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1. 创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 设置连接参数
        connectionFactory.setHost("localhost");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("mrchen");
        connectionFactory.setPassword("mrchen");
        connectionFactory.setVirtualHost("/itcast");
        // 2. 连接工厂获取一个新的连接
        Connection connection = connectionFactory.newConnection();
        // 3. 创建信道对象
        final Channel channel = connection.createChannel();
        // 4. 用信道对象创建队列
        /**
         * queue: * 队列的名称
         * durable: * 是否持久化
         * exclusive: 是否独占该队列
         * autoDelete: 是否自动删除(当所有连接断开后， true自动删除队列)
         * args :  其它队列参数
         *
         * 创建队列的操作时幂等的
         */
        channel.queueDeclare("hello",true,false,false,null);
        // 定义消费者 并重写处理消息的方法
        channel.basicQos(1); // 一次性只接收1条消息 处理完毕后再接收下一条
        Consumer consumer = new DefaultConsumer(channel){
            /**
             * @param consumerTag  消费者标识: 自定义的字符串
             * @param envelope  信封  消息的ID  交换机  路由信息
             * @param properties 消息的属性
             * @param body  消息内容
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(consumerTag+"处理了消息==>" + new String(body));
                channel.basicAck(envelope.getDeliveryTag(),false);
            }
        };
        /**
         * queue: * 要监听的队列
         * autoAc; : * 是否自动确认
         * consumerTag: 消费者标识
         * consumer: 消费者
         */
        channel.basicConsume("hello",false,"我是消费者2:",consumer);
        // 不用管理连接 可以一直监听
    }
}
